package com.uade.sessionBeans.impl;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import org.apache.log4j.Logger;

import com.uade.dao.ArticuloDAO;
import com.uade.entities.ArticuloElectrodomesticoEntity;
import com.uade.entities.ArticuloEntity;
import com.uade.entities.ArticuloInfantilEntity;
import com.uade.entities.ArticuloModaEntity;
import com.uade.entities.ArticuloMuebleEntity;
import com.uade.model.Articulo;
import com.uade.model.ArticuloElectrodomestico;
import com.uade.model.ArticuloInfantil;
import com.uade.model.ArticuloModa;
import com.uade.model.ArticuloMueble;
import com.uade.model.ArticuloRanking;
import com.uade.model.Modelo;
import com.uade.model.Ranking;
import com.uade.model.exceptions.NotFoundException;
import com.uade.sessionBeans.AdministradorArticulos;

@Stateless
public class AdministradorArticulosBean implements AdministradorArticulos {

	private static Logger log = Logger
			.getLogger(AdministradorArticulosBean.class);

	@EJB
	ArticuloDAO articuloDAO;

	@Override
	public Articulo buscar(int id) throws NotFoundException {

		ArticuloEntity articuloEntity = articuloDAO.findById(new Long(id));
		if (null == articuloEntity) {
			log.info("Articulo con id: " + id + " Inexistente ");
			throw new NotFoundException(
					"No se encontro ningun articulo con ese id");
		}

		return articuloEntity.getArticulo();
	}

	@Override
	public List<Articulo> buscar(String nombre, String categoria) throws NotFoundException {
		// ArticuloEntity articuloEntity = articuloDAO.buscarNombre(nombre);
		List<Articulo> articulos = new ArrayList<Articulo>();

		for (ArticuloEntity articuloEntity : articuloDAO.buscarNombre(nombre, categoria)) {
			Articulo art = articuloEntity.getArticulo();
			articulos.add(art);
		}
		if (articulos.isEmpty()) {
			log.info("Articulo/s con nombre: " + nombre + " Inexistente ");
			throw new NotFoundException(
					"No se encontro ningun articulo con ese nombre");
		}

		return articulos;
	}

	@Override
	public List<Articulo> listarProductos() throws NotFoundException {

		List<ArticuloEntity> articuloEntityList = articuloDAO.listarArticulos();
		List<Articulo> articulos = new ArrayList<Articulo>();

		if (null == articuloEntityList || articuloEntityList.isEmpty()) {
			log.info("Lista de articulos vacia  ");
			throw new NotFoundException("No se encontraron articulos");
		}

		for (ArticuloEntity articuloEntity : articuloDAO.listarArticulos()) {
			articulos.add(articuloEntity.getArticulo());
		}

		return articulos;
	}

	@Override
	public void altaProducto(String categoria, String foto, String marca,
			String origen, String descripcion, double precio, String nombre) {

	}

	@Override
	public List<Articulo> listarArticulosByRanking() throws NotFoundException {

		List<ArticuloEntity> articuloEntityList = articuloDAO
				.listarArticulosByRanking();
		List<Articulo> articulos = new ArrayList<Articulo>();
		if (null == articuloEntityList || articuloEntityList.isEmpty()) {
			log.info("Lista de articulos vacia  ");
			throw new NotFoundException("No se encontraron articulos");
		}

		for (ArticuloEntity articuloEntity : articuloDAO.listarArticulos()) {
			articulos.add(articuloEntity.getArticulo());
		}
		return articulos;
	}

	@Override
	public void altaArticulo(Articulo articulo) {

		ArticuloEntity articuloEntity = null;
		if (articulo.getCategoria().equals(Modelo.electrodomestico.toString()))
			articuloEntity = new ArticuloElectrodomesticoEntity(
					(ArticuloElectrodomestico) articulo);
		if (articulo.getCategoria().equals(Modelo.infantil.toString()))
			articuloEntity = new ArticuloInfantilEntity(
					(ArticuloInfantil) articulo);
		if (articulo.getCategoria().equals(Modelo.moda.toString()))
			articuloEntity = new ArticuloModaEntity((ArticuloModa) articulo);
		if (articulo.getCategoria().equals(Modelo.mueble.toString()))
			articuloEntity = new ArticuloMuebleEntity((ArticuloMueble) articulo);
		// Problema con el persist
		log.info("Se parsearon los models. Se actualiza la base de datos");
		articuloDAO.update(articuloEntity);
	}

	@Override
	public void actualizarRanking(Ranking rankings) throws NotFoundException {
		StringBuffer idNoEncontrados = new StringBuffer();
		boolean noEncontrados = false;

		log.info("Actualizar ranking en db local inicio");
		for (ArticuloRanking articuloRanking : rankings.getRankings()) {
			ArticuloEntity articuloActualizar = articuloDAO
					.findById((long) articuloRanking.getCodigoArticulo());
			if (articuloActualizar != null) {
				articuloActualizar.setRanking(articuloRanking.getPosicion());
				articuloDAO.update(articuloActualizar);
				log.info("Articulo : " + articuloActualizar.getNombre()
						+ "Actualizado en pos: "
						+ articuloRanking.getPosicion());
			} else {
				idNoEncontrados.append("ID: "
						+ articuloRanking.getCodigoArticulo());
				log.warn("No se encontro un articulo"
						+ articuloRanking.getCodigoArticulo()
						+ "el ranking no se pudo actualizar");
				noEncontrados = true;

			}

		}
		if (noEncontrados)
			throw new NotFoundException(
					"No se encontro el/los articulos con los siguientes id: "
							+ idNoEncontrados.toString());
		log.info("Se actualizo el ranking");

	}

}
